<?php

/**
 * 获取资源完整的url
 * @param string|null $path 资源路径，如果为 null 或空，则只返回根 URL
 * @return string
 */
function getBaseUrl(string $path = null): string
{
    $protocol = request()->header('x-forwarded-proto');
    if (empty($protocol)) {
        $protocol = request()->protocol;
    }
    if (empty($protocol)) {
        $protocol = 'http';
    }
    $baseUrl = $protocol . '://' . request()->host();
    if (is_null($path) || $path === '') {
        return $baseUrl;
    }
    return $baseUrl . '/' . ltrim($path, '/');
}
/**
 * 手机号中间四位脱敏
 * @param string $phone
 * @return string
 */
function mask_phone(string $phone): string {
    return substr_replace($phone, '****', 3, 4);
}
/**
 * 密码哈希辅助函数
 * @param string $password 明文密码
 * @return string 哈希后的密码
 */
function password_hash_helper(string $password): string {
    return password_hash($password, PASSWORD_DEFAULT,[ 'cost' => 6 ]);
}
/**
 * 成功返回的封装
 * @param array $data 返回的数据
 * @param string $msg  提示信息
 * @param int $code   业务状态码，默认为200
 * @return \support\Response
 */
function success(array $data = [], string $msg = '操作成功', int $code = 200) {
    return json(['code' => $code, 'msg' => $msg, 'data' => $data]);
}
/**
 * 失败返回的封装
 * @param string $msg  提示信息
 * @param array $data  返回的数据
 * @param int $code   业务状态码，默认为500
 * @return \support\Response
 */
function fail(string $msg = '操作失败', array $data = [], int $code = 500) {
    return json(['code' => $code, 'msg' => $msg, 'data' => $data]);
}
/**
 * 生成 JWT
 * @param array $data
 * @param int $days 有效天数
 * @return string
 */
function setJWT(array $data, int $days = 7): string
{
    $cfg    = config('jwt');
    $secret = $cfg['secret'] ?? 'change-me';
    $alg    = $cfg['alg'] ?? 'HS256';
    $now    = time();
    $token  = [
        'iat'  => $now,
        'nbf'  => $now,
        'exp'  => $now + 86400 * $days,
        'data' => $data
    ];
    return \Firebase\JWT\JWT::encode($token, $secret, $alg);
}

/**
 * 解析 JWT
 * @param string $token
 * @return array|null
 */
function getJWT(string $token): ?array
{
    if ($token === '') {
        return null;
    }
    $cfg    = config('jwt');
    $secret = $cfg['secret'] ?? 'change-me';
    $alg    = $cfg['alg'] ?? 'HS256';
    try {
        $decoded = \Firebase\JWT\JWT::decode($token, new \Firebase\JWT\Key($secret, $alg));
        return isset($decoded->data) ? (array)$decoded->data : [];
    } catch (\Throwable $e) {
        \support\Log::error('JWT decode fail: ' . $e->getMessage());
        return null;
    }
}

/**
 * 从请求头获取 Bearer Token
 * @return string
 */
function getHeaderToken(): string
{
    $auth = request()->header('Authorization');
    if (!$auth || !str_starts_with($auth, 'Bearer ')) {
        return '';
    }
    return substr($auth, 7);
}